#include "pch.hpp"
#include "RDBMS.hpp"
#include "SqliteRDBMS.hpp"

using namespace db;




RDBMS::RDBMS()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////

RDBMS::~RDBMS()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////

RDBMS::Ptr RDBMS::create(Type type)
{
	switch(type)
	{
	case SQLITE: return RDBMS::Ptr(new SqliteRDBMS);
	default: BOOSTEXT_THROW(boostext::invalid_value_exception(type));
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////




QString RDBMS::createTableString(TableDL::const_Ptr table) const
{
	QString result;
	result = "create table " + table->dbName() + "\n(\n\t";

	for(std::size_t i = 0; i < table->numAttributes(); ++i)
	{
		Attribute::const_Ptr attribute = table->attribute(i);
		if(i != 0)
			result += ",";

		result += "\n\t";
		result += createAttributeString(attribute);
	}

	result += "\n)";

	return result;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

QString RDBMS::dropTableString(TableDL::const_Ptr table) const
{
	QString result;
	result = "drop table " + table->dbName();

	return result;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

QString RDBMS::createAttributeString(Attribute::const_Ptr attribute) const
{
	QString result;
	result  = attribute->name();
	result += '\t';
	result += dataTypeString(attribute);

	Flags flags = attribute->flags();
	if(flags.isKey())
	{
		result += " PRIMARY KEY";
	}
	else
	{
		result += flags.isUnique() ? " UNIQUE" : "";
		result += flags.isNotNull() ? " NOT NULL" : "";
	}

	result += flags.isAutoIncrement() ? " AUTOINCREMENT" : "";

	return result;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
